It is known that data center traffic, like Internet traffic, is extremely “heavy-tailed,” meaning that a small number of flows (referred to herein as “elephant flows”) carry the majority of traffic and the remaining large number of flows (referred to herein as “mice flows”) carry very little traffic. Given these characteristics, the effect of packet drops for the two types of flows (elephant vs. mice) is vastly different. In particular, while packet drops are used to regulate the rate of elephant flows, packet drops for mice flows, such as incast flows, could be highly detrimental, as any drop of incast packets could severely negatively impact the completion time of the corresponding flow.
Packet prioritization techniques have been used to help mice flows avoid packet drops and help them finished faster while providing enough drops for elephant flows to regulate their rates. One such packet prioritization technique places the first “n” packets of a flow into a high priority queue, which is a strict priority queue that is always serviced first. When a flow has more than n packets, the remaining packets (i.e., those not placed in the strict priority queue) are placed into a low priority queue that is only serviced when the strict priority queue is empty. Note that there is no packet reordering issue with this approach, as the strict priority queue is always serviced first. One weakness of this technique is that if n becomes large, the low priority queue could be starved out. To avoid starvation, a conservative (i.e., low) value of n is typically chosen. However, if n is too small, mice flows cannot be fully sped up.